# -*- coding:utf-8 -*-
# @FileName : app\api\v1\history\routes.py
# @Time     : 2025/11/28
# @Author   : 天空之城

"""历史记录API路由配置

此模块定义历史记录API的路由，包括获取历史记录列表、获取单条历史记录、删除历史记录、导出历史记录等功能。
API层只负责：鉴权 + 参数/响应格式，所有实际的DB操作都委托给HistoryService。
"""
from flask import Blueprint, jsonify, request
from flask import g

from app.api.v1.history.schemas import (
    HistoryRecordSchema,
    HistoryListSchema,
    HistoryDeleteSchema,
    HistoryExportSchema,
)
from app.decorators import login_required, permission_required
from app.services.history_service import HistoryService  # 👈 使用统一服务
from app.extensions import logger
from app.config import DEBUG

# 创建历史记录API蓝图
history_bp = Blueprint('history', __name__)

# 实例化验证模式
history_record_schema = HistoryRecordSchema()
history_list_schema = HistoryListSchema()
history_delete_schema = HistoryDeleteSchema()
history_export_schema = HistoryExportSchema()


@history_bp.route("/", methods=["GET"])
@login_required
def get_histories():
    """获取历史记录列表
    
    GET /api/v1/history/
    返回当前用户的历史记录列表，支持分页
    
    Query Parameters:
        limit (int): 返回记录的数量上限，默认20
        offset (int): 分页偏移量，默认0
    
    Returns:
        JSON: 历史记录列表数据，格式符合HistoryListSchema
    """
    try:
        # 获取查询参数
        limit = request.args.get("limit", 20, type=int)
        offset = request.args.get("offset", 0, type=int)
        
        # 使用统一 HistoryService 获取历史记录列表
        user_id = g.user.id
        histories = HistoryService.list_histories_for_user(
            user_id=user_id, limit=limit, offset=offset
        )
        
        # 验证并返回响应
        result = history_list_schema.dump({"histories": histories})
        return jsonify(result), 200
        
    except Exception as e:
        logger.error(f"获取历史记录列表失败: {str(e)}")
        import traceback
        
        if DEBUG:
            return (
                jsonify({"error": str(e), "traceback": traceback.format_exc()}),
                500,
            )
        return jsonify({"error": "获取历史记录列表失败"}), 500


@history_bp.route("/<int:record_id>", methods=["GET"])
@login_required
def get_history(record_id):
    """获取单条历史记录
    
    GET /api/v1/history/<record_id>
    返回指定ID的历史记录详细信息
    
    Path Parameters:
        record_id (int): 历史记录的唯一ID
    
    Returns:
        JSON: 历史记录详细数据，格式符合HistoryRecordSchema
    """
    try:
        # 使用统一 HistoryService 获取历史记录
        user_id = g.user.id
        history = HistoryService.get_history_for_user(user_id, record_id)
        
        # 检查记录是否存在
        if not history:
            return jsonify({"error": "历史记录不存在"}), 404
        
        # 验证并返回响应
        result = history_record_schema.dump(history)
        return jsonify(result), 200
        
    except Exception as e:
        logger.error(f"获取历史记录失败: {str(e)}")
        return jsonify({"error": "获取历史记录失败"}), 500


@history_bp.route("/<int:record_id>", methods=["DELETE"])
@login_required
@permission_required("delete_history")
def delete_history(record_id):
    """删除单条历史记录
    
    DELETE /api/v1/history/<record_id>
    删除指定ID的历史记录
    
    Path Parameters:
        record_id (int): 历史记录的唯一ID
    
    Returns:
        JSON: 删除成功的消息提示
    """
    try:
        # 使用统一 HistoryService 删除历史记录
        user_id = g.user.id
        success = HistoryService.delete_history_for_user(user_id, record_id)
        
        # 检查删除是否成功
        if not success:
            return jsonify({"error": "历史记录不存在"}), 404
        
        # 使用 schema 的语义字段
        msg = history_delete_schema.dump({"message": "历史记录删除成功"})
        return jsonify(msg), 200
        
    except Exception as e:
        logger.error(f"删除历史记录失败: {str(e)}")
        return jsonify({"error": "删除历史记录失败"}), 500


@history_bp.route("/all", methods=["DELETE"])
@login_required
@permission_required("delete_history")
def delete_all_histories():
    """删除所有历史记录
    
    DELETE /api/v1/history/all
    删除当前用户的所有历史记录
    
    Returns:
        JSON: 删除成功的消息提示
    """
    try:
        # 使用统一 HistoryService 删除所有历史记录
        user_id = g.user.id
        deleted_count = HistoryService.delete_all_histories_for_user(user_id)
        
        return jsonify({"message": f"成功删除{deleted_count}条历史记录"}), 200
        
    except Exception as e:
        logger.error(f"删除所有历史记录失败: {str(e)}")
        return jsonify({"error": "删除所有历史记录失败"}), 500


@history_bp.route("/export", methods=["POST"])
@login_required
@permission_required("export_history")
def export_histories():
    """导出历史记录
    
    POST /api/v1/history/export
    导出当前用户的历史记录
    
    Request Body:
        format (str): 导出格式，支持json、csv、pdf
        include (list): 包含的数据类型，可选
        filters (dict): 筛选条件，可选
    
    Returns:
        JSON: 导出结果，包含导出的文件名、文件内容或下载链接等
    """
    try:
        data = request.get_json() or {}
        
        errors = history_export_schema.validate(data)
        if errors:
            return jsonify({"error": errors}), 400
        
        # 使用统一 HistoryService 导出历史记录
        user_id = g.user.id
        result = HistoryService.export_histories_for_user(
            user_id=user_id,
            format=data["format"],
            include=data.get("include"),
            filters=data.get("filters"),
        )
        
        return jsonify(result), 200
        
    except ValueError as e:
        return jsonify({"error": str(e)}), 400
        
    except Exception as e:
        logger.error(f"导出历史记录失败: {str(e)}")
        return jsonify({"error": "导出历史记录失败"}), 500
